重載overload 。overload 指的是可以定義相同的方法名稱,但是當參數的個數、型別不同,在Java中不會出現錯誤,且當調用方法時,Java會判斷該使用哪一個方法。
程式碼:
class People {
	// 定義屬性
	String name;
	int age;
	
	public void drink(double ml){
	}
	
	public void drink(String day, double ml){
		System.out.println(name + day + "天喝了" + ml + "cc的水"); 
	}
	
	public void drink(double ml, double cc){}
}
上面這樣,定義了三個drink 方法,但是由於參數個數 不同,型別 就算有一個相同,但是只要個數不同,依然符合overload 的格式。
特別要注意的是編譯器
參數個數、型別
權限修飾符、型別返回值
Java的編譯器在判斷類的方法時,首先是先看方法名稱,不同時則判斷為不同的方法,相同時再去判斷參數的個數和型別。
遇到型別提昇的情況時,編譯器會先調用相同型別的方法,除非型別中其中一個參數需要提昇時,才會去調用符合情況的方法。
程式碼:
public class PeopleTest{
	public static void main(String[] args) {
		People people = new People();
			people.name = "Jack";
			people.drink(1000.0); // 喝了1000.0cc的水
			people.drink(50); // 喝了50cc的水
			people.drink(150.9, 50) // ml = 150.9 , cc = 50.0
			
		}
		
		
		
	class People {
		// 定義屬性
		String name;
		int age;
	
		public void drink(double ml) {
			System.out.println("喝了" + ml + "cc的水"); 
		}
		
		public void drink(int ml) {
			System.out.println("喝了" + ml + "cc的水"); 
		}
	
		public void drink(String day, double ml) {
			System.out.println(name + day + "天喝了" + ml + "cc的水"); 
		}
	
		public void drink(double ml, double cc) {
			System.out.println("ml = " + ml + ", cc = " + cc); 
		}
	}
}
可以看到在第四個drink() 方法中,雖然第二個參數寫的是int 型別50 ,但是實際上Java會將它提昇為double型別50.0 。
參數在Java中寫方法時,有時候會確定參數的型別,但是不確定參數的個數,這時候可以這樣寫
格式:
(型別 …參數名稱)
public class People {
	public static void main(String[] args) {
		People people = new People();
		
		people.saySomething("hello","world","!");
	}
	public void saySomething(String ...strs) {
	}
}
當參數除了不確定的數量外,還有其他的參數有聲明時,需要將...args 放在參數的最後
例如:
public void saySomething(String name, String ...strs) {
}
過去沒有...args 的寫法時,是使用Public void saySomething(String[] strs) {} 方式去定義不確定的參數個數,所以這樣的寫法是會出現報錯,因為編譯器認為這兩個是一樣的方式。
第一種:
Public void saySomething(String[] strs) {}
第二種:
Public void saySomething(String ...strs) {} 
使用第一種方式宣告時,在調用時需要在參數中先實例化 這個陣列才能夠使用
Public void saySomething(String[] strs) {}
saySomething(new String[]{"hello","world"}
要遍歷...args 時,可以使用for 循環去調用
Public void saySomething(String ...strs) {
	for(int i = 0; i < strs.length; i++) {
		System.out.print(strs[i] + "\t");
	}
}
當有overload 的情況時,會優先確認是否有相同個數的參數 ,若找不到時才會去調用聲明...args 的方法
Public void saySomething(String ...strs) {
	System.out.print("3333");
} 
Public void saySomething(String str1, String str2) {
	System.out.print("2222");
}
Public void saySomething(String str) {
	System.out.print("1111");
} 
saySomething(String "hello") // 1111
 
saySomething(String "hello",String "world") // 2222
 
saySomething(String "hello",String "hello",String "world") // 3333
saySomething(); // 3333
當沒有放任何參數時,也會調用使用...args 的這個方法。